package MD;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 *
 * @author shibron
 */
public class GlobalMiddleWare {
    

    private Connection connection;

    /* Renvoi un tableau de chaine de caractère contenant la liste des UEs 
     (a terme il y aura en parametre le code utilisateur en String (equivalent numEtudiant)*/
    public ArrayList<ArrayList<String> > getUE() throws SQLException{
        FournisseurConnexion f = new FournisseurConnexion();
        connection = f.createConnection();
        ArrayList<ArrayList <String> > mesUE = new  ArrayList<ArrayList <String> >();
        Statement stat = connection.createStatement();
        ResultSet rs = stat.executeQuery("SELECT idue, codeue FROM ue");
		ArrayList<String> monUe;
        while(rs.next())
        {
            monUe = new ArrayList<String>();
			monUe.add(rs.getString("idue"));
			monUe.add(rs.getString("codeue"));
            mesUE.add(monUe);
        }
        stat.close();
        rs.close();
        connection.close();
        return mesUE;
    }

    /* Renvoi un tableau de chaine de caractère contenant la liste des TDs
     de l'UE passée en paramètre (correspond au codeUE qui doit etre unique et sera notre clé)*/
    public ArrayList<ArrayList<String> > getTD(String codeUE) throws SQLException{
	FournisseurConnexion f = new FournisseurConnexion();
        connection = f.createConnection();
        ArrayList<ArrayList<String> > mesTD = new ArrayList<ArrayList<String> >();
	Statement stat = connection.createStatement();
        ResultSet rs = stat.executeQuery("SELECT tdue.td as idtd, titre FROM td, tdue WHERE ue = '"+codeUE+"' and td.idtd = tdue.td");
        ArrayList<String> monTd;
        while(rs.next())
        {
            monTd = new ArrayList<String>();
            monTd.add(rs.getString("idtd"));
            monTd.add(rs.getString("titre"));
            mesTD.add(monTd);
        }
        stat.close();
        rs.close();
        connection.close();
	return mesTD;
    }

    /*Fonction de recherche par id.
     Renvoi un tableau contenant des tableaux representants les TD,
     eux meme avec premiere case du tableau contenant code et deuxieme contenant titre
     exemple : [["TD00548", "Td 1 : ORM"],["TD154862", "TD 5"]]
     Attention, je veux absolument l'id en premier et le titre en 2eme
     Attention bis, comme pour le getNbTd, il faut vérifier les paramètres vides avant de lancer la requete adequate*/
    public ArrayList<ArrayList<String> > getTD(/*String idEtu, String thematique, String codeUE*/){
        return null;
    }

    /*Fonction de recherche par id.
     Renvoi un tableau contenant des tableaux representants les exercices,
     eux meme avec premiere case du tableau contenant code, deuxieme contenant titre
     et la troisieme contenant l'id du corrigé s'il existe (et que l'utilisateur a le droit d'y acceder), false sinon
     exemple : [["EX00548", "Ex 1 : Scholemisation", "CR00548"],["EX154862", "Exercice 2", "false"]]
     Attention, je veux absolument l'id en premier, le titre en 2eme et true ou false en 3eme
     Attention bis, comme pour le getNbEx, il faut vérifier les paramètres vides avant de lancer la requete adequate*/
    public ArrayList<ArrayList<String> > getEx(/*String idEtu, String thematique, String codeUE,*/String codeTD) throws SQLException{
        FournisseurConnexion f = new FournisseurConnexion();
        connection = f.createConnection();
        ArrayList<ArrayList<String> > mesEX = new ArrayList<ArrayList<String> >();
        Statement stat = connection.createStatement();
        ResultSet rs = stat.executeQuery("SELECT tdexo.exercice as idexo, titre, idcorrection FROM tdexo, exercice WHERE td = '"+codeTD+"' and exercice.idexercice = tdexo.exercice");
        ArrayList<String> unEx;
        while(rs.next())
        {
            unEx = new ArrayList<String>();
            unEx.add(rs.getString("idexo"));
            unEx.add(rs.getString("titre"));
            if (rs.getString("idcorrection") == null)
                unEx.add("false");
            else unEx.add(rs.getString("idcorrection"));
            mesEX.add(unEx);
        }
        stat.close();
        rs.close();
        connection.close();
	return mesEX;
    }

    /*Renvoi un tableau de chaines contenant le document sous formes de chaine
     de caractere qui est un document XML conforme et valide correspondant à l'id du document passé en parametre.
     Il faudra ici se pencher sur l'histoire des en-tets LOM et de comment on peut stocker
     la mise en forme pour savoir ce qu'on fait exactement... Mais y'a surement un parsing a faire par la*/
    public String getDocument(/*String idEtu,*/String idDoc) throws SQLException{
        FournisseurConnexion f = new FournisseurConnexion();
        connection = f.createConnection();
        String contenu = "";
        Statement stat = connection.createStatement();
        ResultSet rs = stat.executeQuery("SELECT titre, description FROM exercice WHERE idexercice = '"+idDoc+"'");
        rs.next();
        contenu += "<doc><titre>"+rs.getString("titre")+"</titre>";
        contenu+= "<contenu><c><id>desc</id><contenu>"+rs.getString("description")+"</contenu></c>";
        rs.close();
        
        ResultSet rs2 = stat.executeQuery("SELECT string, idcontenu FROM contenu, exocontenu WHERE exercice = '"+idDoc+"' and contenu=idcontenu order by indexcontenu" );
        while(rs2.next())
        {
            contenu+= "<c><id>"+rs2.getString("idcontenu")+"</id><contenu>"+rs2.getString("string")+"</contenu></c>";
        }
        contenu+="</contenu></doc>";
        
        stat.close();
        rs2.close();
        connection.close();
	return contenu;
    }

    /*Modifie le document d'id idDoc selon le titre et le xml passés en paramètres.
     De même que pour la version précedente, il faudra vérifier la validité du xml avant de l'enregistrer,
     et, a terme, le fait que l'utilisateur ait bioen le droit de modifier ce document.
     La String renvoyée correspondra au message de confirmation ("enregistrement terminé sans erreur" ou
     "document xml mal formé" ou "erreur de transmition"...)
     Attention : il faut absolument vérifier si ce document avait deja un contenu ou non :
     s'il en avait un c'est une simple modification, sinon c'est qu'il s'agit d'un exercice dont seul la référence
     à été copiée pour le moment et il faut donc recréer un exercice et recopier les references sur les contenus*/
    public String setDocument(/*String idEtu,*/String idDoc, String titre, String xml){
        return null;
    }

    /*Fonction de recherche par mots clés.
     Renvoi un tableau contenant des tableaux representants les TD,
     eux meme avec premiere case du tableau contenant code et deuxieme contenant titre
     exemple : [["TD00548", "Td 1 : ORM"],["TD154862", "TD 5"]]
     Attention, je veux absolument l'id en premier et le titre en 2eme
     Attention bis, comme pour le getNbTd, il faut vérifier les paramètres vides avant de lancer la requete adequate
     Pour démarrer, on va supposer que je t'envoi au maxixmum un mot cle par string passée en paramètre
     mais je suppose qu'a terme les fonctions de recherche pourront porter sur plusieurs mots clés...?
     Attention, il faudra peut etre envisager une version avec un ou et une avec un et ? Pour le moment, il vaut mieux ne faire
     que le ou qui renverra plus de résultats...?*/
    public ArrayList<ArrayList<String> > getTDMotCle(/*String idEtu, String thematique, String UE,*/String TD, String Ex){
        return null;
    }

    /*Fonction de recherche par mots clés.
     Renvoi un tableau contenant des tableaux representants les exercices,
     eux meme avec premiere case du tableau contenant code, deuxieme contenant titre
     et la troisieme contenant l'id du corrigé s'il existe (et que l'utilisateur a le droit d'y acceder), false sinon
     exemple : [["EX00548", "Ex 1 : Scholemisation", "CR00548"],["EX154862", "Exercice 2", "false"]]
     Attention, je veux absolument l'id en premier, le titre en 2eme et true ou false en 3eme
     Attention bis, comme pour le getNbEx, il faut vérifier les paramètres vides avant de lancer la requete adequate
     Pour démarrer, on va supposer que je t'envoi au maxixmum un mot cle par string passée en paramètre
     mais je suppose qu'a terme les fonctions de recherche pourront porter sur plusieurs mots clés...?
     Attention, il faudra peut etre envisager une version avec un ou et une avec un et ? Pour le moment, il vaut mieux ne faire
     que le ou qui renverra plus de résultats...?*/
    public ArrayList<ArrayList<String> > getExMotCle(/*String idEtu, String thematique, String UE,*/String TD, String UE){
        return null;
    }

    /*Permet de creer un TD à partir d'un autre.
     La valeur de retour correpond à l'id du TD ainsi obtenu.
     Attention, le Td créé devra contenir des references sur tous les elements du td copié mais les exercices qu'il
     contient ne devront pas être dupliqués en base.*/
    public String createTdCopie(/*String idEtu, String thematique, String idUE,*/String idTdCopie){
        return null;
    }

    /*Permet de creer un TD.
     La valeur de retour correpond à l'id du TD ainsi obtenu.
     Remarque : pour le moment le TD ne contient rien excepte les information sur qui l'a créé...? cf LOM*/
    public String createTd(/*String idEtu, String thematique, String idUE,*/){
        return null;
    }

    /*Permet de creer un exo à partir d'un autre.
     La valeur de retour correpond à l'id de l'exo ainsi obtenu.
     Attention, l'exo créé devra contenir des references sur tous les elements de l'exo copié mais les contenus qu'il
     contient ne devront pas être dupliqués en base.*/
    public String createExCopie(/*String idEtu, String thematique, String idUE,*/String idTd, String idExCopie){
        return null;
    }

    /*Permet de creer un exo.
     La valeur de retour correpond à l'id de l'exo ainsi obtenu.
     Remarque : pour le moment l'exo ne contient rien excepte les information sur qui l'a créé...? cf LOM*/
    public String createEx(/*String idEtu, String thematique, String idUE,*/){
        return null;
    }

    /*Il faudra une fonction de publication d'un TD mais la base ne contient pas cette info pour le moment donc à faire plus tard...
     Remarque : on risque d'avoir besoin de connaitre cette info pour certaines fonctions précédemment demandées donc modifs à prévoir...*/

    
  

}
    

